package org.example;

import org.example.events.hostable.harassment.AudienceHarassmentActions;
import org.example.events.hostable.harassment.HarassmentEvent;
import org.example.events.hostable.harassment.HostHarassmentActions;
import org.example.events.hostable.sales.ClientSalesActions;
import org.example.events.hostable.sales.HostSalesActions;
import org.example.events.hostable.sales.SalesEvent;
import org.example.item.ball.Ball;
import org.example.item.wallet.Wallet;
import org.example.models.interfaces.own.Ownable;
import org.example.nonmaterial.Relationship;
import org.example.person.Person;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {


        //Creating characters
        Person neznayka = new Person("Незнайка", 10, 167, 50);
        Person kozlik = new Person("Козлик", 10, 170, 49);
        Person sadist1 = new Person("Лоликонщик-коротышка", 21, 130, 75, new ArrayList<>(List.of(new Wallet(1000000))));
        Person sadist2 = new Person("Фарид-коротышка", 21, 130, 75, new ArrayList<>(List.of(new Wallet(1000000))));
        Person sadist3 = new Person("МаксПри-коротышка", 20, 130, 75, new ArrayList<>(List.of(new Wallet(1000000))));
        Person someWatcher = new Person("Кто-то", 20, 40, 75);

        Person merchant = new Person("Торговец-садист", 40, 180, 70, new ArrayList<>(List.of(new Wallet(1000000))));

        //Setting relatioship between neznayka and kozlik
        Relationship friendship = new Relationship(neznayka, kozlik, Relationship.Type.FRIENDSHIP);
        neznayka.addOwnable(friendship);
        kozlik.addOwnable(friendship);


        //Giving balls to merchant
        List<Ball> merchantBalls = new ArrayList<>();
        for(int i = 0; i < 100; i++) merchantBalls.add(new Ball("желтый"));
        merchantBalls.stream()
                .map(Ownable.class::cast)
                .forEach(merchant::addOwnable);


        //Hosting sales event and supplying it with balls
        SalesEvent salesEvent = new SalesEvent();
        merchant.act(HostSalesActions.hostSales(salesEvent, merchantBalls, Map.of(Ball.class, 1)));

        //Joining sales
        sadist1.act(ClientSalesActions.joinSales(salesEvent, Map.of(Ball.class, 4)));
        sadist2.act(ClientSalesActions.joinSales(salesEvent, Map.of(Ball.class, 3)));
        sadist3.act(ClientSalesActions.joinSales(salesEvent, Map.of(Ball.class, 5)));

        merchant.act(HostSalesActions.processClients(salesEvent));
        merchant.act(HostSalesActions.stopSales(salesEvent));

        //Hosting harassment event

        HarassmentEvent harassmentEvent = new HarassmentEvent();

        merchant.act(HostHarassmentActions.hostHarassment(harassmentEvent, kozlik));

        //Joining harassment event

        sadist1.act(AudienceHarassmentActions.joinAsParticipant(
                harassmentEvent,
                sadist1.getOwnables().stream()
                        .filter(Ball.class::isInstance)
                        .map(Ball.class::cast)
                        .collect(Collectors.toList())
        ));

        sadist2.act(AudienceHarassmentActions.joinAsParticipant(
                harassmentEvent,
                sadist2.getOwnables().stream()
                        .filter(Ball.class::isInstance)
                        .map(Ball.class::cast)
                        .collect(Collectors.toList())
        ));

        sadist3.act(AudienceHarassmentActions.joinAsParticipant(
                harassmentEvent,
                sadist3.getOwnables().stream()
                        .filter(Ball.class::isInstance)
                        .map(Ball.class::cast)
                        .collect(Collectors.toList())
        ));

        someWatcher.act(AudienceHarassmentActions.joinAsWatcher(harassmentEvent));
        neznayka.act(AudienceHarassmentActions.joinAsWatcher(harassmentEvent));


        merchant.act(HostHarassmentActions.processParticipants(harassmentEvent));

        merchant.act(HostHarassmentActions.stopHarassment(harassmentEvent));

        /*
        Зрители веселились вовсю. Привлеченные смехом, к толпе присоединялись новые прохожие.
        Торговля мячами шла бойко. Хозяин едва успевал получать деньги. Но Незнайке на этот раз было не до веселья.
        Он с замиранием сердца следил за движениями своего друга и испытывал такое чувство, будто удары доставались не Козлику, а ему самому.
        Он готов был умолять коротышек, чтоб они не обижали бедного Козлика, готов был колотить всех, кто бросал в него мячами, а заодно и владельца балаганчика,
         который придумал это дурацкое развлечение ради собственной выгоды.
         */

    }
}